﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FrameworkLib.Facades;
using GestionePolveri2.DAL;
using GestionePolveriLib.BL;
using FrameworkLib.Filters;
using LinqKit;

namespace GestionePolveriLib.Facades
{
    public class FattureFacade : FacadeBase<GestionePolveriEntities>
    {
        GestionePolveriEntities context = null;

        public FattureFacade()
        {
            context = this.GetContext();
        }

        public FattureFacade(string connectionString)
        {
            context = this.GetContext(connectionString);
        }

        public void LoadAsync(BackgroundWorkerCallbackBase.Callback callback)
        {
            this.RunAsync(() => Get(), callback);
        }

        public List<Fattura> Get()
        {
            List<Fattura> retValue = null;

            try
            {
                var objs = from x in context.Fatture
                           select new Fattura
                           {
                               ID = x.IDFattura,
                               Numero = x.NumFattura,
                               Data = x.DataFattura,
                               Descrizione = x.Descrizione
                           };

                if (objs.Any())
                {
                    retValue = objs.ToList();
                }
            }
            catch (Exception ex)
            {
                this.LastExceptionOccurred = ex;
                throw ex;
            }

            return retValue;
        }

        public List<Fattura> Get(FilterBase<Fatture> filter)
        {
            List<Fattura> retValue = null;

            try
            {
                var objs = from x in context.Fatture.AsExpandable().Where(filter.SetUpFilter())
                           select new Fattura
                           {
                               ID = x.IDFattura,
                               Numero = x.NumFattura,
                               Data = x.DataFattura,
                               Descrizione = x.Descrizione
                           };

                if (objs.Any())
                {
                    retValue = objs.ToList();
                }
            }
            catch (Exception ex)
            {
                this.LastExceptionOccurred = ex;
                throw ex;
            }

            return retValue;
        }

        public bool Add(Fattura fattura)
        {
            bool retValue = false;

            try
            {
                Fatture f = new Fatture();
                f.IDFattura = fattura.ID;
                f.NumFattura = fattura.Numero;
                f.DataFattura = fattura.Data;
                f.Descrizione = fattura.Descrizione;

                context.Fatture.AddObject(f);
                context.SaveChanges();

                fattura.ID = f.IDFattura;

                retValue = true;
            }
            catch (Exception ex)
            {
                this.LastExceptionOccurred = ex;
                throw ex;
            }

            return retValue;
        }

        public bool Modify(Fattura fattura)
        {
            bool retValue = false;

            try
            {
                var obj = from x in context.Fatture
                          where x.IDFattura == fattura.ID
                          select x;

                if (obj.Any())
                {
                    Fatture f = obj.FirstOrDefault();

                    f.NumFattura = fattura.Numero;
                    f.DataFattura = fattura.Data;
                    f.Descrizione = fattura.Descrizione;

                    context.SaveChanges();

                    retValue = true;
                }
            }
            catch (Exception ex)
            {
                this.LastExceptionOccurred = ex;
                throw ex;
            }

            return retValue;
        }

        public bool AddOrModify(Fattura fattura)
        {
            bool retValue = false;

            try
            {
                Fatture f = null;

                var obj = from x in context.Fatture
                          where x.NumFattura == fattura.Numero
                          select x;

                if (obj.Any())
                {
                    f = obj.FirstOrDefault();
                }
                else
                {
                    f = new Fatture();
                    context.Fatture.AddObject(f);
                }

                f.NumFattura = fattura.Numero;
                f.DataFattura = fattura.Data;
                f.Descrizione = fattura.Descrizione;

                context.SaveChanges();

                fattura.ID = f.IDFattura;

                retValue = true;
            }
            catch (Exception ex)
            {
                this.LastExceptionOccurred = ex;
                throw ex;
            }

            return retValue;
        }

        public Fattura Get(string numFattura)
        {
            Fattura retValue = null;

            try
            {
                var objs = from x in context.Fatture
                           where x.NumFattura == numFattura
                           select new Fattura
                           {
                               ID = x.IDFattura,
                               Numero = x.NumFattura,
                               Data = x.DataFattura,
                               Descrizione = x.Descrizione
                           };

                if (objs.Any())
                {
                    retValue = objs.FirstOrDefault();
                }
            }
            catch (Exception ex)
            {
                this.LastExceptionOccurred = ex;
                throw ex;
            }

            return retValue;
        }
    }
}
